﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Globalization;
using System.Linq;
using System.Text;

namespace RiskMan.DataClass.Models.Plaza_II.FortsFuttradeRepl
{
    /// <summary>
    /// Журнал заявок по связкам
    /// </summary>
    public class MultilegOrdersLog: INotifyPropertyChanged
    {
        #region private

        private long _replId;
        private long _replRev;
        private long _replAct;
        private long _idOrd;
        private int _sessId;
        private string _clientCode;
        private DateTime _moment;
        private int _status;
        private int _action;
        private int _isinId;
        private int _dir;
        private Decimal _price;
        private int _amount;
        private int _amountRest;
        private string _comment;
        private int _hedge;
        private int _trust;
        private int _extId;
        private string _loginFrom;
        private string _brokerTo;
        private string _brokerToRts;
        private DateTime _dateExp;
        private long _idOrd1;
        private Decimal _ratePrice;
        private Decimal _swapprice;
        private string _brokerFromRts;
        private long _idDeal;
        private Decimal _dealPrice;
        private DateTime _localStamp;

        #endregion

        #region public


        /// <summary>
        /// Служебное поле подсистемы репликации
        /// </summary>
        public long ReplId
        {
            get { return _replId; }
            set
            {
                if (_replId != value)
                {
                    _replId = value;
                    RaisePropertyChanged("ReplId");
                }
            }
        }

        /// <summary>
        /// Служебное поле подсистемы репликации
        /// </summary>
        public long ReplRev
        {
            get { return _replRev; }
            set
            {
                if (_replRev != value)
                {
                    _replRev = value;
                    RaisePropertyChanged("ReplRev");
                }
            }
        }

        /// <summary>
        /// Служебное поле подсистемы репликации
        /// </summary>
        public long ReplAct
        {
            get { return _replAct; }
            set
            {
                if (_replAct != value)
                {
                    _replAct = value;
                    RaisePropertyChanged("ReplAct");
                }
            }
        }

        /// <summary>
        /// Номер заявки
        /// </summary>
        public long IdOrd
        {
            get { return _idOrd; }
            set
            {
                if (_idOrd != value)
                {
                    _idOrd = value;
                    RaisePropertyChanged("IdOrd");
                }
            }
        }

        /// <summary>
        /// Идентификатор торговой сессии
        /// </summary>
        public int SessId
        {
            get { return _sessId; }
            set
            {
                if (_sessId != value)
                {
                    _sessId = value;
                    RaisePropertyChanged("SessId");
                }
            }
        }

        /// <summary>
        /// Код клиента
        /// </summary>
        public string ClientCode
        {
            get { return _clientCode; }
            set
            {
                if (_clientCode != value)
                {
                    _clientCode = value;
                    RaisePropertyChanged("ClientCode");
                }
            }
        }

        /// <summary>
        /// Время изменения состояния заявки
        /// </summary>
        public DateTime Moment
        {
            get { return _moment; }
            set
            {
                if (_moment != value)
                {
                    _moment = value;
                    RaisePropertyChanged("Moment");
                }
            }
        }

        /// <summary>
        /// Статус заявки
        /// </summary>
        public int Status
        {
            get { return _status; }
            set
            {
                if (_status != value)
                {
                    _status = value;
                    RaisePropertyChanged("Status");
                }
            }
        }

        /// <summary>
        /// Действие с заявкой
        /// • Поле status представляет собой битовую маску
        /// 0x01 Котировочная
        /// 0x02 Встречная
        /// 0x04 Внесистемная
        /// 0x1000 Запись является последней в транзакции
        /// 0x2000 Заявка Репо с КЦ
        /// 0x20000 Заявка Репо
        /// 0x40000 Обычная заявка по связке
        /// • Поле action описывает действие, произошедшее с заявкой
        /// 0 Заявка удалена
        /// 1 Заявка добавлена
        /// 2 Заявка сведена в сделку
        /// </summary>
        public int Action
        {
            get { return _action; }
            set
            {
                if (_action != value)
                {
                    _action = value;
                    RaisePropertyChanged("Action");
                }
            }
        }

        /// <summary>
        /// Идентификатор инструмента-связки
        /// </summary>
        public int IsinId
        {
            get { return _isinId; }
            set
            {
                if (_isinId != value)
                {
                    _isinId = value;
                    RaisePropertyChanged("IsinId");
                }
            }
        }

        /// <summary>
        /// Направление
        /// </summary>
        public int Dir
        {
            get { return _dir; }
            set
            {
                if (_dir != value)
                {
                    _dir = value;
                    RaisePropertyChanged("Dir");
                }
            }
        }

        /// <summary>
        /// Цена
        /// </summary>
        public Decimal Price
        {
            get { return _price; }
            set
            {
                if (_price != value)
                {
                    _price = value;
                    RaisePropertyChanged("Price");
                }
            }
        }

        /// <summary>
        /// Количество в операции
        /// </summary>
        public int Amount
        {
            get { return _amount; }
            set
            {
                if (_amount != value)
                {
                    _amount = value;
                    RaisePropertyChanged("Amount");
                }
            }
        }

        /// <summary>
        /// Оставшееся количество в заявке
        /// </summary>
        public int AmountRest
        {
            get { return _amountRest; }
            set
            {
                if (_amountRest != value)
                {
                    _amountRest = value;
                    RaisePropertyChanged("AmountRest");
                }
            }
        }

        /// <summary>
        /// Комментарий трейдера
        /// </summary>
        public string Comment
        {
            get { return _comment; }
            set
            {
                if (_comment != value)
                {
                    _comment = value;
                    RaisePropertyChanged("Comment");
                }
            }
        }

        /// <summary>
        /// Признак хеджевой заявки
        /// </summary>
        public int Hedge
        {
            get { return _hedge; }
            set
            {
                if (_hedge != value)
                {
                    _hedge = value;
                    RaisePropertyChanged("Hedge");
                }
            }
        }

        /// <summary>
        /// Признак заявки доверительного управления
        /// </summary>
        public int Trust
        {
            get { return _trust; }
            set
            {
                if (_trust != value)
                {
                    _trust = value;
                    RaisePropertyChanged("Trust");
                }
            }
        }

        /// <summary>
        /// Внешний номер
        /// </summary>
        public int ExtId
        {
            get { return _extId; }
            set
            {
                if (_extId != value)
                {
                    _extId = value;
                    RaisePropertyChanged("MyProperty");
                }
            }
        }

        /// <summary>
        /// Логин пользователя, поставившего заявку
        /// </summary>
        public string LoginFrom
        {
            get { return _loginFrom; }
            set
            {
                if (_loginFrom != value)
                {
                    _loginFrom = value;
                    RaisePropertyChanged("LoginFrom");
                }
            }
        }

        /// <summary>
        /// Код FORTS фирмы-адресата внесистемной заявки
        /// </summary>
        public string BrokerTo
        {
            get { return _brokerTo; }
            set
            {
                if (_brokerTo != value)
                {
                    _brokerTo = value;
                    RaisePropertyChanged("BrokerTo");
                }
            }
        }

        /// <summary>
        /// Код RTS фирмы-адресата внесистемной заявки

        /// </summary>
        public string BrokerToRts
        {
            get { return _brokerToRts; }
            set
            {
                if (_brokerToRts != value)
                {
                    _brokerToRts = value;
                    RaisePropertyChanged("BrokerToRts");
                }
            }
        }

        /// <summary>
        /// Дата истечения заявки
        /// </summary>
        public DateTime DateExp
        {
            get { return _dateExp; }
            set
            {
                if (_dateExp != value)
                {
                    _dateExp = value;
                    RaisePropertyChanged("DateExp");
                }
            }
        }

        /// <summary>
        /// Номер первой заявки
        /// </summary>
        public long IdOrd1
        {
            get { return _idOrd1; }
            set
            {
                if (_idOrd1 != value)
                {
                    _idOrd1 = value;
                    RaisePropertyChanged("IdOrd1");
                }
            }
        }
        
        /// <summary>
        /// Ставка заявки
        /// Поле rate_price для инструментов, торгуемых в своп цене, содержит 0
        /// </summary>
        public Decimal RatePrice
        {
            get { return _ratePrice; }
            set
            {
                if (_ratePrice != value)
                {
                    _ratePrice = value;
                    RaisePropertyChanged("RatePrice");
                }
            }
        }
        
        /// <summary>
        /// Своп-цена заявки
        /// </summary>
        public Decimal Swapprice
        {
            get { return _swapprice; }
            set
            {
                if (_swapprice != value)
                {
                    _swapprice = value;
                    RaisePropertyChanged("Swapprice");
                }
            }
        }

        /// <summary>
        /// Код РТС клиента - владельца заявки
        /// </summary>
        public string BrokerFromRts
        {
            get { return _brokerFromRts; }
            set
            {
                if (_brokerFromRts != value)
                {
                    _brokerFromRts = value;
                    RaisePropertyChanged("BrokerFromRts");
                }
            }
        }

        /// <summary>
        /// Идентификатор сделки по данной записи журнала заявок
        /// </summary>
        public long IdDeal
        {
            get { return _idDeal; }
            set
            {
                if (_idDeal != value)
                {
                    _idDeal = value;
                    RaisePropertyChanged("IdDeal");
                }
            }
        }

        /// <summary>
        /// Цена заключенной сделки
        /// </summary>
        public Decimal DealPrice
        {
            get { return _dealPrice; }
            set
            {
                if (_dealPrice != value)
                {
                    _dealPrice = value;
                    RaisePropertyChanged("DealPrice");
                }
            }
        }

        /// <summary>
        /// Локальное время пользователя
        /// </summary>
        public DateTime LocalStamp
        {
            get { return _localStamp; }
            set
            {
                if (_localStamp != value)
                {
                    _localStamp = value;
                    RaisePropertyChanged("LocalStamp");
                }
            }
        }

        #endregion

        #region event PropertyChangedEventHandler

        public event PropertyChangedEventHandler PropertyChanged;

        protected void RaisePropertyChanged(string propertyName)
        {
            var handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        #endregion

        #region processing
        public static MultilegOrdersLog ParseMultilegOrdersLog(Dictionary<String, String> relation)
        {
            MultilegOrdersLog tmp = new MultilegOrdersLog();
            tmp.Parse(relation);
            return tmp;
        }

        public void Parse(Dictionary<String, String> relation)
        {
            foreach (String field in relation.Keys)
            {
                String value = relation[field];

                switch (field)
                {
                    case "replID": long.TryParse(value, out _replId); break;
                    case "replRev": long.TryParse(value, out _replRev); break;
                    case "replAct": long.TryParse(value, out _replAct); break;
                    case "id_ord": long.TryParse(value, out _idOrd); break;
                    case "sess_id": int.TryParse(value, out _sessId); break;
                    case "client_code": _clientCode = value; break;
                    case "moment": DateTime.TryParse(value, out _moment); break;
                    case "status": int.TryParse(value, out _status); break;
                    case "action": int.TryParse(value, out _action); break;
                    case "isin_id": int.TryParse(value, out _isinId); break;
                    case "dir": int.TryParse(value, out _dir); break;
                    case "price": Decimal.TryParse(value, NumberStyles.Number, CultureInfo.GetCultureInfo("en-US"), out _price); break;
                    case "amount": int.TryParse(value, out _amount); break;
                    case "amount_rest": int.TryParse(value, out _amountRest); break;
                    case "comment": _comment = value; break;
                    case "hedge": int.TryParse(value, out _hedge); break;
                    case "trust": int.TryParse(value, out _trust); break;
                    case "ext_id": int.TryParse(value, out _extId); break;
                    case "login_from": _loginFrom = value; break;
                    case "broker_to": _brokerTo = value; break;
                    case "broker_to_rts": _brokerToRts = value; break;
                    case "date_exp": DateTime.TryParse(value, out _dateExp); break;
                    case "id_ord1": long.TryParse(value, out _idOrd1); break;
                    case "rate_price": Decimal.TryParse(value, NumberStyles.Number, CultureInfo.GetCultureInfo("en-US"), out _ratePrice); break;
                    case "swapprice": Decimal.TryParse(value, NumberStyles.Number, CultureInfo.GetCultureInfo("en-US"), out _swapprice); break;
                    case "broker_from_rts": _brokerFromRts = value; break;
                    case "id_deal": long.TryParse(value, out _idDeal); break;
                    case "deal_price": Decimal.TryParse(value, NumberStyles.Number, CultureInfo.GetCultureInfo("en-US"), out _dealPrice); break;
                    case "local_stamp": DateTime.TryParse(value, out _localStamp); break; 


                };
            }
        }

        public static void AddValueToObsColMultilegOrdersLog(MultilegOrdersLog inst)
        {
            MainWindow.StaticLevel._dataProvider.MultilegOrdersLogList.Add(inst);
        }
        #endregion
    }
}
